/**
 * @file projv2.h
 * @brief Fichier d'entête de INSIDOUS
 * */
#ifndef _PROJV2_H
#define _PROJV2_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/**
    * @Structure Pixel contient les 3 codes couleurs rouge,vert,bleu
*/
struct sPixel
{
  unsigned char red; 
  unsigned char green; 
  unsigned char blue;
};
typedef struct sPixel pixel;


/**
 * @fn void lireEntete( const char nomFichier[], unsigned int * largeur, unsigned int * hauteur);
 * @brief Procédure lecture de l'entête de l'image en récupérant les dimensions (hauteur,largeur).
 * @brief Precondition : nomFichier est le nom d'un fichier au format Bitmap,
   24-bit par pixel (donc pas de palette), non compresse.
 * @brief Postconditions : largeur et hauteur contiennent la largeur (nombre de colonnes) et la hauteur (nombre de lignes) de l'image, en nombre de pixels.
*/
void lireEntete( const char nomFichier[], unsigned int * largeur, unsigned int * hauteur);


//int initialisation(char *nomImage, unsigned int hauteur,unsigned int largeur);

/**
 * @fn void remplirTableauPixelsDepuisFichier(const char nomFichier[], pixel tab[],unsigned int largeur, unsigned int hauteur);
 * @brief Procédure de remplissage d'une table de type structure pixel avec les pixels de l'image choisie.
 * 
 * @Preconditions : tab est un tableau 1D de pixels, suffisamment grand pour contenir tous les pixels de l'image. nomFichier est le nom d'un fichier au format Bitmap, 24-bit par pixel (donc pas de palette), non compresse. largeur et hauteur: sont les dimensions de l'image en nombre de pixels.
   @Postcondition : Chaque case de tab correspond a un pixel de l'image et contient ainsi les valeurs RGB de ce pixel. Les premieres cases de tab contiennent la ligne de pixels tout en bas de l'image. Les cases suivantes contiennent les pixels de la ligne juste au-dessus (2e ligne en partant du bas), etc, jusqu'a la ligne du haut de l'image.
*/
void remplirTableauPixelsDepuisFichier(const char nomFichier[], pixel tab[],unsigned int largeur, unsigned int hauteur);


/**
 * @fn void ecrireFichier(const char nomFic[], const pixel tab[], unsigned int largeur, unsigned int hauteur);
 * @brief ecriture fichier (création image au format bmp
 * 
 * Preconditions : tab est un tableau contenant largeur*hauteur pixels.
   Postconditions : Un nouveau fichier est cree, nomme comme precise dans la chaine de caracteres nomFic. Il est au format Bitmap, 24 bits par pixel,nomFicImage non compresse.
   Si un fichier de ce nom existait déjà, il est ecrase.
 */
void ecrireFichier(const char nomFic[], const pixel tab[], unsigned int largeur, unsigned int hauteur);

void traitementSepia(const pixel tab[], pixel tabRes[], unsigned int largeur, unsigned int hauteur, unsigned int p);

/**
 * @fn void dissimulation(const pixel tab1[], const pixel tab2[],  pixel tab3[], unsigned int largeur, unsigned int hauteur, unsigned int nbBite);
 * @brief Procédure de dissimulation, extrait et fusionne les 2 tableaux de pixels des 2 images dans une seule table
        (selont le nombre de pixel choisi pour le traitement
*/
void dissimulation(const pixel tab1[], const pixel tab2[],  pixel tab3[], unsigned int largeur, unsigned int hauteur, unsigned int nbBite);

/**
 * @fn void extraction(const pixel *tab1,  pixel *tab3, unsigned int largeur, unsigned int hauteur, unsigned int nbBite);
 * @brief Procédure d'extraction des pixels de l'images dissimulée
*/
void extraction(const pixel *tab1,  pixel *tab3, unsigned int largeur, unsigned int hauteur, unsigned int nbBite);


void LireChaine(char chaine[], int size);


/**
 * @fn void fskip(FILE *fp, int num_bytes);
 * @brief Procedure auxiliaire utile pour lire les fichiers
*/
void fskip(FILE *fp, int num_bytes);

/**
 * @fn unsigned char getIemeBit(unsigned char nombre, unsigned char numbit);
 * @brief Accesseur: récupération la valeur d'un bit donné
*/
unsigned char getIemeBit(unsigned char nombre, unsigned char numbit);


/**
 * @fn void setIemeBit0(unsigned char * nombre, unsigned char numbit);
 * @brief Mutateur: Mise à 0 un bite renseigné
 * Precondition: 0 <= numbit <= 7, 0 correspond au bit de poids faible
   Postcondition: le bit numero 'numbit' de 'nombre' est mis a 1
*/
void setIemeBit0(unsigned char * nombre, unsigned char numbit);


/**
 * @fn void setIemeBit1(unsigned char * nombre,  unsigned char numbit);
 * @brief Mutateur: Mise à 1 un bite renseigné
 * Precondition: 0 <= numbit <= 7, 0 correspond au bit de poids faible
   Postcondition: le bit numero 'numbit' de 'nombre' est mis a 1
*/
void setIemeBit1(unsigned char * nombre,  unsigned char numbit);


#endif
